package com.heu.blood.dict.service.impl;

import com.heu.blood.dict.entity.DictDepartmentEntity;
import com.heu.blood.dict.vo.BloodProductVo;
import com.heu.blood.dict.vo.DepartmentDictVo;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heu.blood.common.utils.PageUtils;
import com.heu.blood.common.utils.Query;

import com.heu.blood.dict.dao.DictBloodProductDao;
import com.heu.blood.dict.entity.DictBloodProductEntity;
import com.heu.blood.dict.service.DictBloodProductService;


@Service("dictBloodProductService")
public class DictBloodProductServiceImpl extends ServiceImpl<DictBloodProductDao, DictBloodProductEntity> implements DictBloodProductService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<DictBloodProductEntity> page = this.page(
                new Query<DictBloodProductEntity>().getPage(params),
                new QueryWrapper<DictBloodProductEntity>()
        );

        return new PageUtils(page);
    }

    @Override
    public List<BloodProductVo> getTreeRes() {
        List<DictBloodProductEntity> list = this.list();
        List<BloodProductVo> res = new ArrayList<>();
        // 最先遍历一遍找到根节点
        for(DictBloodProductEntity entity : list){
            if(entity.getParentCode().equals("0")){
                BloodProductVo vo = new BloodProductVo();
                vo.setCode(entity.getCode());
                vo.setParentCode(entity.getParentCode());
                vo.setLabel(entity.getName());
                vo.setChildren(new ArrayList<>());
                vo.setUnit(entity.getUnit());
                vo.setDictCode(entity.getDictCode());
                vo.setDuration(entity.getDuration());
                res.add(vo);
            }
        }
        for(BloodProductVo curVo : res){
            process(curVo,list);
        }
        return res;
    }

    /**
     * 递归查找方法
     * @param curVo
     * @param list
     */
    public void process(BloodProductVo curVo,List<DictBloodProductEntity> list){
        for(DictBloodProductEntity entity : list){
            if(entity.getParentCode().equals(curVo.getCode())){
                BloodProductVo vo = new BloodProductVo();
                vo.setCode(entity.getCode());
                vo.setParentCode(entity.getParentCode());
                vo.setLabel(entity.getName());
                vo.setUnit(entity.getUnit());
                vo.setChildren(new ArrayList<>());
                vo.setDictCode(entity.getDictCode());
                vo.setDuration(entity.getDuration());
                curVo.getChildren().add(vo);
                process(vo,list);
            }
        }
    }

    /**
     * 创建DictCode映射
     *
     * @return Map<String, String>
     */
    @Override
    public Map<String, String> createDictCodeMap() {
        Map<String, String> dictCodeMap = new HashMap<>();

        List<DictBloodProductEntity> list = this.list();

        for(DictBloodProductEntity entity : list){
            if(entity.getParentCode().equals("0")){
                dictCodeMap.put(entity.getDictCode(), entity.getDictCode());
            } else {
                String parentDictCode = getParentDictCode(entity.getParentCode(), list);
                if (parentDictCode != null) {
                    dictCodeMap.put(entity.getDictCode(), parentDictCode);
                }
            }
        }

        return dictCodeMap;
    }

    /**
     * 获取父节点的DictCode
     * @param parentCode
     * @param list
     * @return String
     */
    private String getParentDictCode(String parentCode, List<DictBloodProductEntity> list) {
        for (DictBloodProductEntity entity : list) {
            if (entity.getCode().equals(parentCode)) {
                return entity.getDictCode();
            }
        }
        return null;
    }
}